package model

import (
	"awesomeProject/global"
	"database/sql/driver"
	"encoding/json"
	"errors"
	uuid "github.com/satori/go.uuid"
	"gorm.io/gorm"
)

type UserFillAble struct {
	UUID           uuid.UUID   `json:"uuid" gorm:"comment:用户UUID"`       // 用户UUID
	Username       string      `json:"username" gorm:"comment:用户名"`      // 用户名
	Password       string      `json:"password" gorm:"comment:登录密码"`     // 密码
	Salt           string      `json:"-" gorm:"comment:密码盐值"`            // 密码盐值
	Nickname       string      `json:"nickname" gorm:"comment:昵称"`       // 密码盐值
	Status         int         `json:"status" gorm:"comment:状态：0禁用，1启用"` // 用户状态
	CompanyId      uint        `json:"company_id" gorm:"comment:所属组织"`   // 所属组织
	AllowIp        string      `json:"allow_ip" gorm:"comment:授权ip"`      // 授权ip
	BanIp          string      `json:"ban_ip" gorm:"comment:禁止ip"`        // 禁止ip
	ExCompanyIds   string      `json:"ex_company_ids" gorm:"comment:附属公司ID"`     // 附属公司ID
	ShopIds   UserShopIds `json:"shop_ids" gorm:"comment:店铺权限"`     // 店铺权限
}

type User struct {
	gorm.Model
	UserFillAble
	Company    Company `json:"company" gorm:"foreignKey:CompanyId"`
	SuperAdmin bool    `json:"super_admin" gorm:"-"`
}

type UserCache struct {
	ID   uint   `redis:"id" json:"id"`
	UUID string `redis:"uuid" json:"uuid"`
}

func (u *User) BeforeDelete(tx *gorm.DB) (err error) {
	if u.ID == global.SuperAdminUserID {
		return errors.New("超级管理员不允许删除！")
	}
	return
}

type UserShopIds []uint

func (r UserShopIds) Value() (driver.Value, error) {
	b, err := json.Marshal(r)
	return b, err
}

func (r *UserShopIds) Scan(input interface{}) error {
	return json.Unmarshal(input.([]byte), r)
}
